Tupychka/dev#23
Merged
Merged
Conversation
…comment tree social_search gains a `url` mode: pass a Reddit post link to fetch that post (title + selftext) plus its full, nested comment tree in one sandboxed call, no API key. Discovery (`query`) mode is unchanged; the tool now takes query OR url, and its description steers the model to prefer this over web_fetch for a known Reddit link (and it works in Secure Mode, where host-side web_fetch isn't offered). Comment scraping is a faithful port of last30days-skill's reddit_shreddit: sort=top, thingId-anchored bodies bounded by the next rtjson anchor, skip deleted/removed, \b-bounded attribute reads. We keep the whole tree with a per-comment `depth` (rendered as indentation) instead of a top-10 digest. Title/selftext come from old.reddit, anchored on the post's own t3_<id> so the sidebar description is never mistaken for the body. Verified live across r/ClaudeCode, r/selfhosted, r/homelab (self + link posts, unicode). Known limit: first page of the tree only — deep "load more" branches are not paginated. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Clickable poster (the mode picker) links to docs/iClaw_video.mp4, a ~50s no-sound walkthrough of inspecting an untrusted shell script in an isolated sandbox. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Use <picture> with prefers-color-scheme so the star-history chart matches the viewer's GitHub theme, instead of a single light-only image. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…oster Demo now embeds the GitHub user-attachments asset so it plays inline in the README, like other repos. Removes the redundant committed docs/iClaw_video.mp4 (3.2 MB) and poster image now that GitHub hosts the video. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Long scheduled messages (and queued ones — they share the card) rendered at full height and could take over the whole composer area. Clamp the message text to 2 lines with a "Show more"/"Show less" toggle that appears only when the content actually overflows; short messages are unchanged. Restructure the card into a text block above a full-width footer strip: schedule time (⏰) + toggle on the left, action buttons pushed to the right. Overflow is measured client-side (applyPendingRowClamp) across both render paths — server EJS first paint and JS live render — and both lists. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Pain-led pitch + comparison table vs OpenClaw, Hermes and Claude Code (sandbox safety, project isolation, cost / no lock-in, one-key setup, minimalist UI). Setup difficulty shown as a skull meter. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Work/Secure/Incognito sent image_url blocks to whatever ICLAW_MODEL is set, so a text-only default (deepseek/deepseek-v4-flash) made OpenRouter return "404 No endpoints found that support image input" (hit in chats 314/321). Full Power was unaffected — it forwards to OpenClaw's gateway, whose model is vision-capable. Mirror OpenClaw's capability gate (iClaw is OpenRouter-only): new agent/model-capabilities.ts reads architecture.input_modalities from OpenRouter /models (cached 1h, stale-on-error, ICLAW_VISION_MODELS allowlist escape hatch). resolveTurnModel() only looks up on image turns and routes a confirmed text-only model to ICLAW_VISION_MODEL (default google/gemini-2.5-flash); text turns are untouched. Wired into both agent loops (loop.ts, secure-runner.ts) via an effectiveModel. describeApiError is exported from loop.ts + gains an image-404 safety net for the unknown-capability path; secure-runner now uses it too. Tests: test/unit/modelCapabilities.test.ts (8). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Switch the context-compaction (summary) model default from google/gemini-2.5-flash-lite to tencent/hy3-preview. Still overridable via ICLAW_SUMMARY_MODEL. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- waveform now advances on a fixed 55ms cadence (was once per animation frame), so it scrolls ~3x slower — matching the Flutter app amplitude stream (~50ms) - raise gain (2.4 -> 3.0) and carry the peak between samples so bars track loudness (taller when loud) - hide the floating lock pill once locked; it was overlapping the hint - locked state: drop the "tap mic to send" text and move Cancel down to the toolbar row, centered and level with the send button (wave gets the full row) - center the quick-tap "hold the mic to record" hint Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The secure-workspace bar keyed its visibility (and Export/Apply/Destroy + TTL) off `rawChatId` — a const captured once at page load. A chat that starts as a draft has no id until the first message adopts it; adoptDraftChat updates messagesEl.dataset.chatId but rawChatId stays empty, so the bar stayed hidden until a reload re-rendered at /chats/:id. Read the id live via a secureChatId() helper instead, and refresh the bar on turn-ended so it also appears after a slow first-turn sandbox start (the fixed post-send retry timers can miss it). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Model defaults (all overridable via ICLAW_*_MODEL): - Main agent, web-search, runtime summaries → minimax/minimax-m2.7 - Host chat compaction → tencent/hy3-preview; chat titles now reuse it - STT / Vision stay on google/gemini-2.5-flash Remove the unused "Ask" direct-OpenRouter path (replaced by Incognito): - Drop streamComplete()/StreamCompletionOpts (zero callers) and the askModel config field; complete() now requires an explicit model. - Refresh stale "Ask mode" copy in Settings (tab/section -> "Voice"), .env.example, and code comments. The live task-page Ask is untouched. typecheck + full vitest suite (421 tests) pass; Settings page verified to render. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Secure Mode shipped no web-research tools: web_fetch/web_search are host-side (a host fetch would bypass the container's --network gate), so the agent fell back to hand-rolling `curl ... | jq` for any web/API call. Add Secure variants that keep the sandbox boundary intact: - web_fetch runs the fetch as curl INSIDE the sandbox (runInSandbox), then reuses the existing canonicalize / htmlToText / summarize / cache path on the host. The URL is shQuote'd against shell injection; the body is capped in-container (head -c) under the docker-exec stdout buffer, with the status+content-type marker emitted before the body. - web_search uses only the OpenRouter web plugin (host->OpenRouter, same trust as the chat stream), gated on networkEnabled; no host DDG. Wire both into the secure loop and steer the secure prompt to prefer them over raw curl. Work/Incognito are unchanged. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Remove the unreachable "Apply changes" feature end-to-end — UI button, host route /chats/:id/apply-sandbox, runtime /sessions/:id/apply, secure-export helpers, and its tests. Secure Mode has no folder-ingest UI, so apply could only ever report "nothing to apply". The dormant copyFolders ingest plumbing is left in place. Secure workspace bar: - TTL is now per-chat (default 7 days); the whole bar stays hidden until the sandbox actually holds something. - Unified "delete" vocabulary: "deletes in 6d" with an inline-clickable value that opens the retention menu; Destroy and Save are icon buttons that slide out their label on hover. - "Save to my computer" (export) confirms with a plain-language warning that the files leave the sandbox; exported folders are named by local date-time instead of an epoch number. Chat header: Share and Delete collapse to icons with hover-reveal labels on desktop (mobile was already icon-only). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Changes
Screenshots / GIFs
How to test
Checklist
devnpm run typecheckpassesnpm run buildpassesCHANGELOG.mdunder[Unreleased]if user-visibleROADMAP.mdif a planned item is now done